#+TITLE: Designing a Sway Service
#+AUTHOR:Joshua Branson

* Sway Service thoughts 
** example config

   #+BEGIN_SRC scheme
     (sway-configuration
      (variables
       (sway-variables-configuration
        (launch-terminal (bindsym (command "dmenu")
                                  (key-combo "$mod+Return")))))
      (bindsyms
       (list %sway-layout-bindsyms
             %sway-workspace-bindsyms
             (bindsym
              (command)
              (key-combo))
             (bindsym
              (command)
              (key-combo)))))
   #+END_SRC

   The below were the original config templates.

     #+BEGIN_SRC scheme
             (service sway-service-type
                      (sway-configuration
                       (variables
                        (sway-variables
                         (letter-left "n")
                         (letter-right "s")
                         (letter-up "t")
                         (letter-down "h")
                         (default-terminal alacritty)
                         (application-launcher dmenu)
                         (desktop-background-file "image.png")))
                       (bindsyms
                        (sway-bindsyms
                         (kill-focused-window (sway-bindsym (key-combo "$mod+Control+f")
                                                            (command "snhaue")))
                         (start-launcher (sway-bindsym (key-combo "$mod+d")
                                                       (command "aosnuth")))
                         (reload-config-file (sway-bindsym (key-combo "$mod+Control+r")
                                                           (command "aosnuth")))
                         (exit-sway (sway-bindsym (key-combo "$mod+Control+e")
                                                  (command "aosnuth")))
                         (sway-lower-volume-bindsym (sway-bindsym (key-combo "")
                                                                  (command "aosnuth")))
                         (sway-toggle-mute-bindsym (sway-bindsym (key-combo "")
                                                                 (command "aosnuth")))
                         (vertical-split (sway-bindsym (key-combo "")
                                                       (command "aosnuth")))
                         (layout-stacking (sway-bindsym (key-combo "")
                                                        (command "aosnuth")))
                         (layout-tabbed (sway-bindsym (key-combo "")
                                                      (command "aosnuth")))
                         (layout-toggle-split (sway-bindsym (key-combo "")
                                                            (command "aosnuth")))
                         (fullscreen (sway-bindsym (key-combo "")
                                                   (command "aosnuth")))
                         (toggle-floating-and-tile (sway-bindsym (key-combo "")
                                                                 (command "aosnuth")))
                         ))))
   #+END_SRC
   
   Alternative config

   #+BEGIN_SRC scheme
     (service sway-service-type
              (sway-configuration
               (sway-variables (mod-key "Mod4")
                               (default-terminal "alacritty")
                               (direction-letters
                                (letter-left "h")
                                (letter-right "t")
                                (letter-up "n")
                                (letter-down "s"))
                               (application-launcher 'dmenu)
                               (keyboard-layout "dvorak")
                               (xkb-options (list "ctrl:swapcaps")))
               (sway-bindsyms (launch-terminal "$mod+p")
                              (kill-focused-window "$mod+Control+f")
                              (start-launcher "$mod+d")
                              (reload-config-file "$mod+Control+r")
                              (exit-sway "$mod+Control+e")
                              (sway-volume-bindsyms (sway-raise-volume-bindsym "")
                                                    (sway-lower-volume-bindsym "")
                                                    (sway-toggle-mute-bindsym ""))

                              (sway-moving-bindsyms
                               )
                              (sway-workspace-bindsyms (extra-workspace-bindsyms
                                                        (list <bindsym> ...)))
                              (sway-layout-bindsyms (horizontal-split "")
                                                    (vertical-split "")
                                                    (layout-stacking "")
                                                    (layout-tabbed "")
                                                    (layout-toggle-split "")
                                                    (fullscreen "")
                                                    (toggle-floating-and-tile "")
                                                    (move-focus-to-parent "")))))
   #+END_SRC

   Suppose the user wants to use the "alacritty" as their default
   terminal...should alacritty is found via =which= or =guix package
   -I=, or should mod+Return just execute the command
   /gnu/store/xxxxxxxx/bin/alacritty?
   
** sway-service
   
*** sway-configuration 
**** variables
***** sway-variables-configuration
****** mod-key
****** default-terminal 
****** letter-left
****** letter-right
****** letter-up
****** letter-down
****** application-launcher
****** keyboard-layout
****** xkb-options 
****** tap-to-click?  default t
****** natural-scrolling? default t
****** middle-emulation? default #f 
****** desktop-background-file
****** xwayland-enable? 
**** sway-idle-configuration will be included in V2
***** time-to-lock-screen  default 300
***** time-to-turn-off-screens  default 600
**** sway-input-configuration  list of sway-input-records  This will be for V2 of the  service
     # You can get the names of your inputs by running: swaymsg -t get_inputs
     # Read `man 5 sway-input` for more information about this section.
***** input-records
****** input-record
******* screen-name default "*"
******* xkboptions   This is WHERE we define keyboard layout
**** bindsyms
     (record-type-fields)
***** sway-bindsyms-configuration     
****** launch-terminal  "$mod+Return" 
****** kill-focused-window "$mod+Control+c" 
****** start-launcher 
****** reload-config-file 
****** exit-sway 

****** THE FOLLOWING ARE CUSTOM BINDSYMS OF MINE. 
****** volume-commands
****** sway-raise-volume-command
****** sway-lower-volume-command
****** sway-mute-volume-command
****** eject-command 

****** focus-left
****** focus-down
****** focus-up
****** focus-right
****** focus-arrow-keys-left
****** focus-arrow-keys-down
****** focus-arrow-keys-up
****** focus-arrow-keys-right
****** move-left
****** move-down
****** move-up
****** move-right
****** move-arrow-keys-left
****** move-arrow-keys-down
****** move-arrow-keys-up
****** move-arrow-keys-right

****** switch-to-workspace-1
****** switch-to-workspace-2
****** switch-to-workspace-3
****** switch-to-workspace-4
****** switch-to-workspace-5
****** switch-to-workspace-6
****** switch-to-workspace-7
****** switch-to-workspace-8
****** switch-to-workspace-9
****** switch-to-workspace-10
****** move-container-to-workspace-1
****** move-container-to-workspace-2
****** move-container-to-workspace-3
****** move-container-to-workspace-4
****** move-container-to-workspace-5
****** move-container-to-workspace-6
****** move-container-to-workspace-7
****** move-container-to-workspace-8
****** move-container-to-workspace-9
****** move-container-to-workspace-10

****** split-screen-horizontal
****** split-screen-vertical
****** split-container-stacking
****** split-container-tabbed
****** split-container-split
****** fullscreen-key
****** toggle-tiling-and-floating-mode
****** toggle-focus-between-the-tiling-and-floating-area
****** move-focus-to-parent
****** move-window-to-scratchpad
****** cycle-through-scratchpad
****** resize-containers
****** resizing-containers-bindsym
      tesize" variable is just hardcoded.

****** scratchpad-bindsyms
****** extra-bindsyms
      :PROPERTIES:
      :ID:       d9a84303-6fb0-463d-83bb-0d1a44b91c3c
      :END:
****** <sway-bindsym>
******* whole-window default #f
******* border default #f
******* exclude-titlebar #f
******* release  #f
******* locked #f
******* to-code #f
******* input-device default #nil
******* no-warm default #f 
******* no-repeat #f
******* group
******* key-combo string
******* command string or <package>
******* command-arguments 
        If you specify a <package> and command-arguments, then turn your sway config file into:

        bindsym $mod+AudioRaiseButton  /gnu/store/asthsaonthasntuh/bin/pactl <pactl arguments>
**** status-status-bar
***** sway-status-bar-configuration
*** How to build the sway-config file 

**** how to generate the sway-bindsyms 
     (record-type-fields)

     Everything field inside sway-bindsyms (including recursively) is

     - record  (and (record?) (not (sway-bindsym?)))
       Then you use record-type-fields, and you assume each field is bindsym or a list of bindsym.
       And you then (emit-bindsym) on each field.
     - bindsym (sway-bindsym?)
     - list of bindsyms (list?)
       If this is only a list of bindsyms, 
       then loop through the list and emit-bindsym on each list item.
       
     #+BEGIN_SRC scheme
       (define (emit-sway-configuration sway-configuration)
         (let loop ([record-field-names]))
         (cond [(and? (record? ))]))

     #+END_SRC
     
** take the keyboard-layout from OS, and set-env XKB_LAYOUT environmental variable 
   [[file:~/prog/gnu/guix/guix-src/gnu/services/base.scm::(setenv "LINUX_MODULE_DIRECTORY"][how LINUX_MODULE_DIRECTORY is set]]
   
   [[file:~/prog/gnu/guix/guix-src/gnu/installer/services.scm::'((set-xorg-configuration][maybe put (setenv "XKB_KEYBOARD_LAYOUT")  in this file?]]
* creating guix records built upon records upon records etc. makes an odd syntax 

Suppose that you have records build on records built on records etc.

  - sway configuration
    - sway-bindsyms
      - sway-bindsym
        
Then this may end of looking like:
    
#+BEGIN_SRC scheme
(sway-configuration
 (sway sway@1.2)
 (user sway-user)
 (group sway-group)
 (commands
  (sway-bindsyms
   (basic-bindsyms
    (sway-basic-bindsyms
     (launch-terminal (sway-bindsym (command alacritty)
                                    (key-combo "$mod4+2")))
     (basic-extra-bindsyms (list
                            (sway-bindsym (command firefox)
                                          (key-combo "$mod4+Control+f"))
                            (sway-bindsym (command emacs)
                                          (key-combo "$mod4+control+e"))))))
   (moving-around-bindsyms
    (sway-moving-around-bindsyms
     (focus-left (sway-bindsym
                  (key-combo "mod4+$left")
                  (command "focus left"))))))))

#+END_SRC

You'll see that there is a bit of repetition.  A records initializer can repeat it's parents' field.

So I am changing my mind and I am just making a TON of <sway-bindsym>s


* V1  
**  This will just create the .config/sway/config file.
**  This hardcodes "resize" variable.
**  status bar is hardcoded for V1.

* V2
** This will launch sway at login.
**  This allows users to tweak "resize" variable.
**  The status bar is user configurable.
** Users can make custom "set" values. eg: set $fire command
** allow the user to change sway-idle-configuration 
** will get the keyboard layout from the operating-system object 
* V3 other options that sway has that we should consider throwing into data structures 
  I can see all of this via man 5 sway
** bar man sway-bar 5
** default orientation 
** bar [<bar-id>] <bar-subcommands...>
   For details on bar subcommands, see sway-bar(5).

** default_orientation horizontal|vertical|auto
   Sets the default container layout for tiled containers.

** include <path>
   Includes another file from path. path can be either a full path or
   a path relative to the parent config, and expands shell
   syntax (see wordexp(3) for details). The same include file
   can only be included once; subsequent attempts will be
   ignored.

** swaybg_command <command>
   Executes custom background command. Default is swaybg. Refer to
   sway-output(5) for more information.

   It can be disabled by setting the command to a single dash:
   swaybg_command -

** swaynag_command <command>
   Executes custom command for swaynag. Default is swaynag. Additional
   arguments may be appended to the end. This should only be used to
   either direct sway to call swaynag from a custom path or to provide
   additional arguments. This should be placed at the top of the con‐
   fig for the best results.
   
   It can be disabled by setting the command to a single dash: sway‐
   nag_command -

** workspace_layout default|stacking|tabbed
   Specifies the initial layout for new workspaces.

** xwayland enable|disable|force
           Enables or disables Xwayland support, which allows X11 applications
           to be used. enable will lazily load Xwayland so Xwayland will not
           be launched until the first client attempts to connect. In some
           cases, such as slower machines, it may be desirable to have Xway‐
           land started immediately by using force instead of enable.

** The following commands cannot be used directly in the configuration
   file.  They are expected to be used with bindsym or at runtime through
   swaymsg(1).

** border none|normal|csd|pixel [<n>]
   Set border style for focused window. normal includes a border of
   thickness n and a title bar. pixel is a border without title bar n
   pixels thick. Default is normal with border thickness 2. csd is
   short for client-side-decorations, which allows the client to draw
   its own decorations.

** border toggle
   Cycles through the available border styles.

** exit
   Exit sway and end your Wayland session.

** floating enable|disable|toggle
   Make focused view floating, non-floating, or the opposite of what
   it is now.

** <criteria> focus
   Moves focus to the container that matches the specified criteria.

** focus up|right|down|left
   Moves focus to the next container in the specified direction.

** focus prev|next [sibling]
   Moves focus to the previous or next container in the current lay‐
   out. By default, the last active child of the newly focused con‐
   tainer will be focused. The sibling option indicates not to immedi‐
   ately focus a child of the container.

** focus child
   Moves focus to the last-focused child of the focused container.

** focus parent
   Moves focus to the parent of the focused container.

** focus output up|right|down|left
   Moves focus to the next output in the specified direction.

** focus output <name>
   Moves focus to the named output.

** focus tiling
   Sets focus to the last focused tiling container.

** focus floating
   Sets focus to the last focused floating container.

** focus mode_toggle
   Moves focus between the floating and tiled layers.

** fullscreen [enable|disable|toggle] [global]
   Makes focused view fullscreen, non-fullscreen, or the opposite of
   what it is now. If no argument is given, it does the same as tog‐
   gle. If global is specified, the view will be fullscreen across all
   outputs.

** gaps inner|outer|horizontal|vertical|top|right|bottom|left all|current
   set|plus|minus <amount>
   Changes the inner or outer gaps for either all workspaces or the
   current workspace. outer gaps can be altered per side with top,
   right, bottom, and left or per direction with horizontal and verti‐
   cal.
           
** inhibit_idle focus|fullscreen|open|none|visible
   Set/unset an idle inhibitor for the view. focus will inhibit idle
   when the view is focused by any seat. fullscreen will inhibit idle
   when the view is fullscreen (or a descendant of a fullscreen con‐
   tainer) and is visible. open will inhibit idle until the view is
   closed (or the inhibitor is unset/changed). visible will inhibit
   idle when the view is visible on any output. none will remove any
   existing idle inhibitor for the view.
   
   This can also be used with criteria to set an idle inhibitor for
   any existing view or with for_window to set idle inhibitors for fu‐
   ture views.

** layout default|splith|splitv|stacking|tabbed
   Sets the layout mode of the focused container.

** layout toggle [split|all]
   Cycles the layout mode of the focused container though a preset
   list of layouts. If no argument is given, then it cycles through
   stacking, tabbed and the last split layout. If split is given, then
   it cycles through splith and splitv. If all is given, then it cy‐
   cles through every layout.

** layout toggle [split|tabbed|stacking|splitv|splith]
   [split|tabbed|stacking|splitv|splith]...
   Cycles the layout mode of the focused container through a list of
   layouts.

** max_render_time off|<msec>
   Controls when the relevant application is told to render this win‐
   dow, as a positive number of milliseconds before the next time sway
   composites the output. A smaller number leads to fresher rendered
   frames being composited by sway and lower perceived input latency,
   but if set too low, the application may not finish rendering before
   sway composites the output, leading to delayed frames.

   When set to off, the relevant application is told to render this
   window immediately after display refresh. How much time is left for
   rendering before sway composites the output at that point depends
   on the output max_render_time setting.
   
   To set this up for optimal latency:
           1.   Set up output max_render_time (see sway-output(5)).
           2.   Put the target application in full-screen and have it continu‐
               ously render something.
           3.   Start by setting max_render_time 1. If the application drops
               frames, increment by 1.

           This setting only has an effect if a per-output max_render_time is
           in effect on the output the window is currently on. See sway-out‐
           put(5) for further details.

** move left|right|up|down [<px> px]
   Moves the focused container in the direction specified. If the con‐
   tainer, the optional px argument specifies how many pixels to move
   the container.  If unspecified, the default is 10 pixels. Pixels
   are ignored when moving tiled containers.

** move [absolute] position <pos_x> [px] <pos_y> [px]
   Moves the focused container to the specified position in the
   workspace. If absolute is used, the position is relative to all
   outputs.

** move [absolute] position center
   Moves the focused container to be centered on the workspace. If ab‐
   solute is used, it is moved to the center of all outputs.
   
** move position cursor|mouse|pointer
   Moves the focused container to be centered on the cursor.

** move [container|window] [to] mark <mark>
   Moves the focused container to the specified mark.

** move [--no-auto-back-and-forth] [container|window] [to] workspace [num‐
   ber] <name>
   Moves the focused container to the specified workspace. The string
   number is optional and is used to match a workspace with the same
   number, even if it has a different name.
   
** move [container|window] [to] workspace prev|next|current
   Moves the focused container to the previous, next or current
   workspace on this output, or if no workspaces remain, the previous
   or next output.

** move [container|window] [to] workspace prev_on_output|next_on_output
   Moves the focused container to the previous or next workspace on
   this output, wrapping around if already at the first or last
   workspace.

** move [container|window] [to] workspace back_and_forth
   Moves the focused container to previously focused workspace.

** move [container|window] [to] output <name-or-id>|current
   Moves the focused container to the specified output.

** move [container|window] [to] output up|right|down|left
   Moves the focused container to next output in the specified direc‐
   tion.

** move [container|window] [to] scratchpad
   Moves the focused container to the scratchpad.

** move workspace [to] output <name-or-id>|current
   Moves the focused workspace to the specified output.

** move workspace to [output] <name-or-id>|current
   Moves the focused workspace to the specified output.

** move workspace [to] output up|right|down|left
   Moves the focused workspace to next output in the specified direc‐
   tion.

** move workspace to [output] up|right|down|left
   Moves the focused workspace to next output in the specified direc‐
   tion.

** nop <comment>
   A no operation command that can be used to override default behav‐
   iour. The optional comment argument is ignored, but logged for de‐
   bugging purposes.

** reload
   Reloads the sway config file and applies any changes. The config
   file is located at path specified by the command line arguments
   when started, otherwise according to the priority stated in
   sway(1).

** rename workspace [<old_name>] to <new_name>
   Rename either <old_name> or the focused workspace to the <new_name>

** resize shrink|grow width|height [<amount> [px|ppt]]
   Resizes the currently focused container by amount, specified in
   pixels or percentage points. If the units are omitted, floating
   containers are resized in px and tiled containers by ppt. amount
   will default to 10 if omitted.
           
** resize set height <height> [px|ppt]
   Sets the height of the container to height, specified in pixels or
   percentage points. If the units are omitted, floating containers
   are resized in px and tiled containers by ppt. If height is 0, the
   container will not be resized.

** resize set [width] <width> [px|ppt]
   Sets the width of the container to width, specified in pixels or
   percentage points. If the units are omitted, floating containers
   are resized in px and tiled containers by ppt. If width is 0, the
   container will not be resized.

** resize set [width] <width> [px|ppt] [height] <height> [px|ppt]
   Sets the width and height of the container to width and height,
   specified in pixels or percentage points. If the units are omitted,
   floating containers are resized in px and tiled containers by ppt.
   If width or height is 0, the container will not be resized on that
   axis.

** scratchpad show
   Shows a window from the scratchpad. Repeatedly using this command
   will cycle through the windows in the scratchpad.

** shortcuts inhibitor enable|disable
   Enables or disables the ability of clients to inhibit keyboard
   shortcuts for a view. This is primarily useful for virtualization
   and remote desktop software. It affects either the currently fo‐
   cused view or a set of views selected by criteria. Subcommand dis‐
   able additionally deactivates any active inhibitors for the given
   view(s).  Criteria are particularly useful with the for_window com‐
   mand to configure a class of views differently from the per-seat
   defaults established by the seat subcommand of the same name. See
   sway-input(5) for more ways to affect inhibitors.

** split vertical|v|horizontal|h|toggle|t
   Splits the current container, vertically or horizontally. When tog‐
   gle is specified, the current container is split opposite to the
   parent container's layout.

** splith
   Equivalent to split horizontal

** splitv
   Equivalent to split vertical

** splitt
   Equivalent to split toggle

** sticky enable|disable|toggle
   "Sticks" a floating window to the current output so that it shows
   up on all workspaces.

** swap container with id|con_id|mark <arg>
   Swaps the position, geometry, and fullscreen status of two contain‐
   ers. The first container can be selected either by criteria or fo‐
   cus. The second container can be selected by id, con_id, or mark.
   id can only be used with xwayland views. If the first container has
   focus, it will retain focus unless it is moved to a different
   workspace or the second container becomes fullscreen on the same
   workspace as the first container. In either of those cases, the
   second container will gain focus.

** title_format <format>
   Sets the format of window titles. The following placeholders may be
   used:

   %title - The title supplied by the window
   %app_id - The wayland app ID (applicable to wayland
   windows only)
   %class - The X11 classname (applicable to xwayland
   windows only)
   %instance - The X11 instance (applicable to xwayland
   windows only)
   %shell - The protocol the window is using (typically
   xwayland or
   xdg_shell)

   This command is typically used with for_window criteria. For exam‐
   ple:
   
   for_window [title="."] title_format "<b>%title</b> (%app_id)"
   
   Note that markup requires pango to be enabled via the font command.
   
   The default format is "%title".
   
   The following commands may be used either in the configuration file or
   at runtime.

** assign <criteria> [→] [workspace] [number] <workspace>
  Assigns views matching criteria (see CRITERIA for details) to
  workspace. The → (U+2192) is optional and cosmetic. This command is
  equivalent to:

               for_window <criteria> move container to workspace <workspace>

** assign <criteria> [→] output left|right|up|down|<name>
   Assigns views matching criteria (see CRITERIA for details) to the
   specified output. The → (U+2192) is optional and cosmetic. This
   command is equivalent to:

   for_window <criteria> move container to output <output>

**   bindsym [--whole-window] [--border] [--exclude-titlebar] [--release]
   [--locked] [--to-code] [--input-device=<device>] [--no-warn] [--no-re‐
   peat] [Group<1-4>+]<key combo> <command>
   Binds key combo to execute the sway command command when pressed.
   You may use XKB key names here (wev(1) is a good tool for discover‐
   ing these).  With the flag --release, the command is executed when
   the key combo is released. If input-device is given, the binding
   will only be executed for that input device and will be executed
   instead of any binding that is generic to all devices. If a group
   number is given, then the binding will only be available for that
   group. By default, if you overwrite a binding, swaynag will give
   you a warning. To silence this, use the --no-warn flag.

   Unless the flag --locked is set, the command will not be run when a
   screen locking program is active. If there is a matching binding
   with and without --locked, the one with will be preferred when
   locked and the one without will be preferred when unlocked. If
   there are matching bindings and one has both --input-device and
   --locked and the other has neither, the former will be preferred
   even when unlocked.

   Unless the flag --inhibited is set, the command will not be run
   when a keyboard shortcuts inhibitor is active for the currently fo‐
   cused window. Such inhibitors are usually requested by remote desk‐
   top and virtualization software to enable the user to send keyboard
   shortcuts to the remote or virtual session. The --inhibited flag
   allows to define bindings which will be exempt from pass-through to
   such software. The same preference logic as for --locked applies.

   Unless the flag --no-repeat is set, the command will be run repeat‐
   edly when the key is held, according to the repeat settings speci‐
   fied in the input configuration.
   
   Bindings to keysyms are layout-dependent. This can be changed with
   the --to-code flag. In this case, the keysyms will be translated
   into the corresponding keycodes in the first configured layout.

   Mouse bindings operate on the container under the cursor instead of
   the container that has focus. Mouse buttons can either be specified
   in the form button[1-9] or by using the name of the event code (ex
   BTN_LEFT or BTN_RIGHT). For the former option, the buttons will be
   mapped to their values in X11 (1=left, 2=middle, 3=right, 4=scroll
   up, 5=scroll down, 6=scroll left, 7=scroll right, 8=back, 9=for‐
   ward). For the latter option, you can find the event names using
   libinput debug-events.

   The priority for matching bindings is as follows: input device,
   group, and locked state.

   --whole-window, --border, and --exclude-titlebar are mouse-only op‐
   tions which affect the region in which the mouse bindings can be
   triggered.  By default, mouse bindings are only triggered when over
   the title bar. With the --border option, the border of the window
   will be included in this region.  With the --whole-window option,
   the cursor can be anywhere over a window including the title, bor‐
   der, and content. --exclude-titlebar can be used in conjunction
   with any other option to specify that the titlebar should be ex‐
   cluded from the region of consideration.

   If --whole-window is given, the command can be triggered when the
   cursor is over an empty workspace. Using a mouse binding over a
   layer surface's exclusive region is not currently possible.
   
   Example:
   # Execute firefox when alt, shift, and f are pressed together
   bindsym Mod1+Shift+f exec firefox

** bindcode [--whole-window] [--border] [--exclude-titlebar] [--re‐
   lease] [--locked] [--input-device=<device>] [--no-warn]
   [Group<1-4>+]<code> <command> is also available for binding with
   key/button codes instead of key/button names.

** bindswitch [--locked] [--no-warn] [--reload] <switch>:<state> <command>
   Binds <switch> to execute the sway command command on state
   changes.  Supported switches are lid (laptop lid) and tablet
   (tablet mode) switches. Valid values for state are on, off and tog‐
   gle. These switches are on when the device lid is shut and when
   tablet mode is active respectively. toggle is also supported to run
   a command both when the switch is toggled on or off.

   Unless the flag --locked is set, the command will not be run when a
   screen locking program is active. If there is a matching binding
   with and without --locked, the one with will be preferred when
   locked and the one without will be preferred when unlocked.

   If the --reload flag is given, the binding will also be executed
   when the config is reloaded. toggle bindings will not be executed
   on reload.  The --locked flag will operate as normal so if the con‐
   fig is reloaded while locked and --locked is not given, the binding
   will not be executed.

   By default, if you overwrite a binding, swaynag will give you a
   warning. To silence this, use the --no-warn flag.

   Example:
   # Show the virtual keyboard when tablet mode is entered.
   bindswitch tablet:on busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true
   
   # Log a message when the laptop lid is opened or closed.
   bindswitch lid:toggle exec echo "Lid moved"

**   client.<class> <border> <background> <text> [<indicator> [<child_bor‐
       der>]]
       Configures the color of window borders and title bars. The first
       three colors are required. When omitted indicator will use a sane
       default and child_border will use the color set for background.
       Colors may be specified in hex, either as #RRGGBB or #RRGGBBAA.

       The available classes are:

       - client.focused
       The window that has focus.

       - client.focused_inactive
       The most recently focused view within a container which is not
       focused.

       - client.placeholder
         Ignored (present for i3 compatibility).

       - client.unfocused
         A view that does not have focus.

       - client.urgent
       A view with an urgency hint. Note: Native Wayland windows do
       not support urgency. Urgency only works for Xwayland windows.
       
       The meaning of each color is:
       
       - border
       The border around the title bar.
       
       - background
       The background of the title bar.

       - text
       The text color of the title bar.

       - indicator
       The color used to indicate where a new view will open. In a
       tiled container, this would paint the right border of the cur‐
       rent view if a new view would be opened to the right.

           child_border
               The border around the view itself.

       The default colors are:

       ┌────────────┬─────────┬────────────┬─────────┬───────────┬────────────┐
       │   class    │ border  │ background │ text    │ indicator │ child_bor‐ │
       │            │         │            │         │           │ der        │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │background  │ n/a     │ #ffffff    │ n/a     │ n/a       │ n/a        │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │focused     │ #4c7899 │ #285577    │ #ffffff │ #2e9ef4   │ #285577    │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │focused_in‐ │ #333333 │ #5f676a    │ #ffffff │ #484e50   │ #5f676a    │
       │active      │         │            │         │           │            │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │unfocused   │ #333333 │ #222222    │ #888888 │ #292d2e   │ #222222    │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │urgent      │ #2f343a │ #900000    │ #ffffff │ #900000   │ #900000    │
       ├────────────┼─────────┼────────────┼─────────┼───────────┼────────────┤
       │placeholder │ #000000 │ #0c0c0c    │ #ffffff │ #000000   │ #0c0c0c    │
       └────────────┴─────────┴────────────┴─────────┴───────────┴────────────┘

       default_border normal|none|pixel [<n>]
           Set default border style for new tiled windows.

       default_floating_border normal|none|pixel [<n>]
           Set default border style for new floating windows. This only ap‐
           plies to windows that are spawned in floating mode, not windows
           that become floating afterwards.

       exec <shell command>
           Executes shell command with sh.

       exec_always <shell command>
           Like exec, but the shell command will be executed again after
           reload.

       floating_maximum_size <width> x <height>
           Specifies the maximum size of floating windows. -1 x -1 removes the
           upper limit. The default is 0 x 0, which will use the width and
           height of the entire output layout as the maximums

       floating_minimum_size <width> x <height>
           Specifies the minimum size of floating windows. The default is 75 x
           50.

       floating_modifier <modifier> [normal|inverse]
           When the modifier key is held down, you may hold left click to move
           windows, and right click to resize them. Setting modifier to none
           disables this feature. If inverse is specified, left click is used
           for resizing and right click for moving.

       focus_follows_mouse yes|no|always
           If set to yes, moving your mouse over a window will focus that win‐
           dow. If set to always, the window under the cursor will always be
           focused, even after switching between workspaces.

       focus_on_window_activation smart|urgent|focus|none
           This option determines what to do when an xwayland client requests
           window activation. If set to urgent, the urgent state will be set
           for that window. If set to focus, the window will become focused.
           If set to smart, the window will become focused only if it is al‐
           ready visible, otherwise the urgent state will be set. Default is
           urgent.

       focus_wrapping yes|no|force|workspace
           This option determines what to do when attempting to focus over the
           edge of a container. If set to no, the focused container will re‐
           tain focus, if there are no other containers in the direction. If
           set to yes, focus will be wrapped to the opposite edge of the con‐
           tainer, if there are no other containers in the direction. If set
           to force, focus will be wrapped to the opposite edge of the con‐
           tainer, even if there are other containers in the direction. If set
           to workspace, focus will wrap like in the yes case and additionally
           wrap when moving outside of workspaces boundaries.  Default is yes.

       font [pango:]<font>
           Sets font to use for the title bars. To enable support for pango
           markup, preface the font name with pango:. For example, monospace
           10 is the default font. To enable support for pango markup,
           pango:monospace 10 should be used instead. Regardless of whether
           pango markup is enabled, font should be specified as a pango font
           description. For more information on pango font descriptions, see
           https://developer.gnome.org/pango/stable/pango-Fonts.html#pango-
           font-description-from-string

       titlebar_border_thickness <thickness>
           Thickness of the titlebar border in pixels

       titlebar_padding <horizontal> [<vertical>]
           Padding of the text in the titlebar. horizontal value affects hori‐
           zontal padding of the text while vertical value affects vertical
           padding (space above and below text). Padding includes titlebar
           borders so their value should be greater than titlebar_bor‐
           der_thickness. If vertical value is not specified it is set to the
           horizontal value.

       for_window <criteria> <command>
           Whenever a window that matches criteria appears, run list of com‐
           mands.  See CRITERIA for more details.

       gaps inner|outer|horizontal|vertical|top|right|bottom|left <amount>
           Sets default amount pixels of inner or outer gap, where the inner
           affects spacing around each view and outer affects the spacing
           around each workspace. Outer gaps are in addition to inner gaps. To
           reduce or remove outer gaps, outer gaps can be set to a negative
           value. outer gaps can also be specified per side with top, right,
           bottom, and left or per direction with horizontal and vertical.

           This affects new workspaces only, and is used when the workspace
           doesn't have its own gaps settings (see: workspace <ws> gaps ...).

       hide_edge_borders [--i3] none|vertical|horizon‐
       tal|both|smart|smart_no_gaps
           Hides window borders adjacent to the screen edges. Default is none.
           The --i3 option enables i3-compatible behavior to hide the title
           bar on tabbed and stacked containers with one child. The
           smart|smart_no_gaps options are equivalent to setting smart_borders
           smart|no_gaps and hide_edge_borders none.

       input <input_device> <input-subcommands...>
           For details on input subcommands, see sway-input(5).

           * may be used in lieu of a specific device name to configure all
           input devices. A list of input device names may be obtained via
           swaymsg -t get_inputs.

       seat <seat> <seat-subcommands...>
           For details on seat subcommands, see sway-input(5).

       kill
           Kills (closes) the currently focused container and all of its chil‐
           dren.

       smart_borders on|no_gaps|off
           If smart_borders are on, borders will only be enabled if the
           workspace has more than one visible child. If smart_borders is set
           to no_gaps, borders will only be enabled if the workspace has more
           than one visible child and gaps equal to zero.

       smart_gaps on|off
           If smart_gaps are on gaps will only be enabled if a workspace has
           more than one child.

       mark --add|--replace [--toggle] <identifier>
           Marks are arbitrary labels that can be used to identify certain
           windows and then jump to them at a later time. Each identifier can
           only be set on a single window at a time since they act as a unique
           identifier. By default, mark sets identifier as the only mark on a
           window. --add will instead add identifier to the list of current
           marks for that window. If --toggle is specified mark will remove
           identifier if it is already marked.

       mode <mode>
           Switches to the specified mode. The default mode is default.

       mode [--pango_markup] <mode> <mode-subcommands...>
           The only valid mode-subcommands... are bindsym, bindcode,
           bindswitch, and set. If --pango_markup is given, then mode will be
           interpreted as pango markup.

       mouse_warping output|container|none
           If output is specified, the mouse will be moved to new outputs as
           you move focus between them. If container is specified, the mouse
           will be moved to the middle of the container on switch. Default is
           output.

       no_focus <criteria>
           Prevents windows matching <criteria> from being focused automati‐
           cally when they're created. This has no effect on the first window
           in a workspace.

** output <output_name> <output-subcommands...>
           For details on output subcommands, see sway-output(5).

           * may be used in lieu of a specific output name to configure all
           outputs.  A list of output names may be obtained via swaymsg -t
           get_outputs.

       popup_during_fullscreen smart|ignore|leave_fullscreen
           Determines what to do when a fullscreen view opens a dialog.  If
           smart (the default), the dialog will be displayed. If ignore, the
           dialog will not be rendered. If leave_fullscreen, the view will
           exit fullscreen mode and the dialog will be rendered.

** set $<name> <value>
           Sets variable $name to value. You can use the new variable in the
           arguments of future commands. When the variable is used, it can be
           escaped with an additional $ (ie $$name) to have the replacement
           happen at run time instead of when reading the config. However, it
           does not always make sense for the variable to be replaced at run
           time since some arguments do need to be known at config time.

** show_marks yes|no
           If show_marks is yes, marks will be displayed in the window bor‐
           ders.  Any mark that starts with an underscore will not be drawn
           even if show_marks is yes. The default is yes.

       opacity [set|plus|minus] <value>
           Adjusts the opacity of the window between 0 (completely transpar‐
           ent) and 1 (completely opaque). If the operation is omitted, set
           will be used.

       tiling_drag  enable|disable|toggle
           Sets whether or not tiling containers can be dragged with the
           mouse. If enabled (default), the floating_mod can be used to drag
           tiling, as well as floating, containers. Using the left mouse but‐
           ton on title bars without the floating_mod will also allow the con‐
           tainer to be dragged. toggle should not be used in the config file.

       tiling_drag_threshold <threshold>
           Sets the threshold that must be exceeded for a container to be
           dragged by its titlebar. This has no effect if floating_mod is used
           or if tiling_drag is set to disable.  Once the threshold has been
           exceeded once, the drag starts and the cursor can come back inside
           the threshold without stopping the drag.  threshold is multiplied
           by the scale of the output that the cursor on.  The default is 9.

       title_align left|center|right
           Sets the title alignment. If right is selected and show_marks is
           set to yes, the marks will be shown on the left side instead of the
           right side.

** unbindswitch <switch>:<state>
           Removes a binding for when <switch> changes to <state>.

** unbindsym [--whole-window] [--border] [--exclude-titlebar] [--release]
       [--locked] [--to-code] [--input-device=<device>] <key combo>
           Removes the binding for key combo that was previously bound with
           the given flags.  If input-device is given, only the binding for
           that input device will be unbound.

** unbindcode [--whole-window] [--border] [--exclude-titlebar] [--re‐
           lease] [--locked] [--input-device=<device>] <code> is also avail‐
           able for unbinding with key/button codes instead of key/button
           names.

** unmark [<identifier>]
           unmark will remove identifier from the list of current marks on a
           window. If identifier is omitted, all marks are removed.

** urgent enable|disable|allow|deny
           Using enable or disable manually sets or unsets the window's urgent
           state. Using allow or deny controls the window's ability to set it‐
           self as urgent. By default, windows are allowed to set their own
           urgency.

** workspace [--no-auto-back-and-forth] [number] <[num:]name>
           Switches to the specified workspace. The num: portion of the name
           is optional and will be used for ordering. If num: is not given and
           name is a number, then it will be also be used for ordering.

           If the no-auto-back-and-forth option is given, then this command
           will not perform a back-and-forth operation when the workspace is
           already focused and workspace_auto_back_and_forth is enabled.

           If the number keyword is specified and a workspace with the number
           already exists, then the workspace with the number will be used. If
           a workspace with the number does not exist, a new workspace will be
           created with the name name.

** workspace prev|next
           Switches to the next workspace on the current output or on the next
           output if currently on the last workspace.

** workspace prev_on_output|next_on_output
           Switches to the next workspace on the current output.

** workspace back_and_forth
           Switches to the previously focused workspace.

** workspace <name> gaps inner|outer|horizontal|vertical|top|right|bot‐
       tom|left <amount>
           Specifies that workspace name should have the given gaps settings
           when it is created.

           This command does not affect existing workspaces. To alter the gaps
           of an existing workspace, use the gaps command.

** workspace <name> output <outputs...>
           Specifies that workspace name should be shown on the specified out‐
           puts.  Multiple outputs can be listed and the first available will
           be used. If the workspace gets placed on an output further down the
           list and an output that is higher on the list becomes available,
           the workspace will be moved to the higher priority output.

           This command does not affect existing workspaces. To move an exist‐
           ing workspace, use the move command in combination with the
           workspace criteria (non-empty workspaces only) or workspace command
           (to switch to the workspace before moving).

** workspace_auto_back_and_forth yes|no
           When yes, repeating a workspace switch command will switch back to
           the prior workspace. For example, if you are currently on workspace
           1, switch to workspace 2, then invoke the workspace 2 command
           again, you will be returned to workspace 1. Default is no.

** CRITERIA
       A criteria is a string in the form of, for example:

           [class="[Rr]egex.*" title="some title"]

       The string contains one or more (space separated) attribute/value
       pairs. They are used by some commands to choose which views to execute
       actions on. All attributes must match for the criteria to match. Crite‐
       ria is retained across commands separated by a ,, but will be reset
       (and allow for new criteria, if desired) for commands separated by a ;.

       Criteria may be used with either the for_window or assign commands to
       specify operations to perform on new views. A criteria may also be used
       to perform specific commands (ones that normally act upon one window)
       on all views that match that criteria. For example:

       Focus on a window with the mark "IRC":

           [con_mark="IRC"] focus

       Kill all windows with the title "Emacs":

           [class="Emacs"] kill

       You may like to use swaymsg -t get_tree for finding the values of these
       properties in practice for your applications.

       The following attributes may be matched with:

       app_id
           Compare value against the app id. Can be a regular expression. If
           value is __focused__, then the app id must be the same as that of
           the currently focused window. app_id are specific to Wayland appli‐
           cations.

       class
           Compare value against the window class. Can be a regular expres‐
           sion. If value is __focused__, then the window class must be the
           same as that of the currently focused window. class are specific to
           X11 applications.

       con_id
           Compare against the internal container ID, which you can find via
           IPC. If value is __focused__, then the id must be the same as that
           of the currently focused window.

       con_mark
           Compare against the window marks. Can be a regular expression.

       floating
           Matches floating windows.

       id
           Compare value against the X11 window ID. Must be numeric.

       instance
           Compare value against the window instance. Can be a regular expres‐
           sion. If value is __focused__, then the window instance must be the
           same as that of the currently focused window.

       pid
           Compare value against the window's process ID. Must be numeric.

       shell
           Compare value against the window shell, such as "xdg_shell" or
           "xwayland".  Can be a regular expression. If value is __focused__,
           then the shell must be the same as that of the currently focused
           window.

       tiling
           Matches tiling windows.

       title
           Compare against the window title. Can be a regular expression. If
           value is __focused__, then the window title must be the same as
           that of the currently focused window.

       urgent
           Compares the urgent state of the window. Can be first, last, lat‐
           est, newest, oldest or recent.

       window_role
           Compare against the window role (WM_WINDOW_ROLE). Can be a regular
           expression. If value is __focused__, then the window role must be
           the same as that of the currently focused window.

       window_type
           Compare against the window type (_NET_WM_WINDOW_TYPE). Possible
           values are normal, dialog, utility, toolbar, splash, menu, drop‐
           down_menu, popup_menu, tooltip and notification.

       workspace
           Compare against the workspace name for this view. Can be a regular
           expression. If the value is __focused__, then all the views on the
           currently focused workspace matches.
